package com.cms.jy.utils;

import java.util.HashMap;
import java.util.Map;

public class CozeApiUtil {

    private  String API_KEY = "pat_0oKWPOd5tG3xa0TC16yHThMDOdqn8uUle1K6C9xHJHAPrL3bQdTs1IHCPnh1neaW";

    private OkHttpUtils okHttpUtils;

    public CozeApiUtil() {
        this.okHttpUtils = new OkHttpUtils();
    }

    /**
     * 查看音色列表
     * 查看可用的音色列表，包括系统预置音色和自定义音色
     *
     * @param filterSystemVoice 是否过滤系统音色 (可选，默认false)
     * @param modelType 音色模型类型，big:大模型, small:小模型 (可选)
     * @param voiceState 音色状态，init:待克隆, cloned:已克隆, all:全部 (可选，默认cloned)
     * @param pageNum 页码 (可选，默认1)
     * @param pageSize 每页数量 (可选，默认100，范围1-100)
     * @return 音色列表响应结果
     * @throws Exception IO异常
     */
    public String listVoices(Boolean filterSystemVoice, String modelType, String voiceState,
                             Integer pageNum, Integer pageSize) throws Exception {
        String url = "https://api.coze.cn/v1/audio/voices";

        // 构建请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer " + API_KEY);
        headers.put("Content-Type", "application/json");

        // 构建查询参数
        Map<String, String> queryParams = new HashMap<>();

        if (filterSystemVoice != null) {
            queryParams.put("filter_system_voice", filterSystemVoice.toString());
        }

        if (modelType != null) {
            queryParams.put("model_type", modelType);
        }

        if (voiceState != null) {
            queryParams.put("voice_state", voiceState);
        }

        if (pageNum != null) {
            queryParams.put("page_num", pageNum.toString());
        }

        if (pageSize != null) {
            queryParams.put("page_size", pageSize.toString());
        }

        // 拼接查询参数到URL
        if (!queryParams.isEmpty()) {
            StringBuilder urlBuilder = new StringBuilder(url);
            urlBuilder.append("?");
            queryParams.forEach((key, value) ->
                    urlBuilder.append(key).append("=").append(value).append("&"));
            // 移除最后一个&
            url = urlBuilder.substring(0, urlBuilder.length() - 1);
            url = url.replace(" ", "%20"); // 处理空格
        }

        // 发送GET请求
        return okHttpUtils.get(url, headers, true);
    }

    /**
     * 查看音色列表（使用默认参数）
     *
     * @return 音色列表响应结果
     * @throws Exception IO异常
     */
    public String listVoices() throws Exception {
        return listVoices(null, null, null, null, null);
    }

    /**
     * 语音合成
     * 将指定文本合成为音频文件
     *
     * @param input 合成语音的文本，经由 UTF-8 编码。长度限制为 1024 字节
     * @param voiceId 音频文件使用的音色 ID
     * @param emotion 情感类型（可选）
     * @param emotionScale 情感值，取值范围：1.0~5.0（可选，默认4.0）
     * @param responseFormat 音频文件的编码格式（可选，默认mp3）
     * @param loudnessRate 输出音频的音量，取值范围 [-50, 100]（可选，默认0）
     * @param speed 语速，取值范围为 0.2~3（可选，默认1）
     * @param sampleRate 音频采样率（可选，默认24000）
     * @return 语音文件的字节数组
     * @throws Exception IO异常
     */
    public byte[] speech(String input, String voiceId, String emotion, Double emotionScale,
                         String responseFormat, Integer loudnessRate, Double speed, Integer sampleRate) throws Exception {
        String url = "https://api.coze.cn/v1/audio/speech";

        // 构建请求头
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", "Bearer " + API_KEY);
        headers.put("Content-Type", "application/json");

        // 构建请求体
        Map<String, Object> body = new HashMap<>();
        body.put("input", input);
        body.put("voice_id", voiceId);

        if (emotion != null) {
            body.put("emotion", emotion);
        }

        if (emotionScale != null) {
            body.put("emotion_scale", emotionScale);
        }

        if (responseFormat != null) {
            body.put("response_format", responseFormat);
        }

        if (loudnessRate != null) {
            body.put("loudness_rate", loudnessRate);
        }

        if (speed != null) {
            body.put("speed", speed);
        }

        if (sampleRate != null) {
            body.put("sample_rate", sampleRate);
        }

        // 发送POST请求，获取字节流
        return okHttpUtils.postJsonForBytes(url, com.alibaba.fastjson.JSON.toJSONString(body), headers, true);
    }

    /**
     * 语音合成（简化版本）
     * 使用默认参数进行语音合成
     *
     * @param input 合成语音的文本
     * @param voiceId 音频文件使用的音色 ID
     * @return 语音文件的字节数组
     * @throws Exception IO异常
     */
    public byte[] speech(String input, String voiceId) throws Exception {
        return speech(input, voiceId, null, null, null, null, null, null);
    }



    public static void main(String[] args) throws Exception {
        CozeApiUtil cozeApiUtil = new CozeApiUtil();
        // https://www.coze.cn/open/docs/dev_how_to_guides/sys_voice 音色列表
        // 获取音色列表
        String voices = cozeApiUtil.listVoices();
        System.out.println("音色列表: " + voices);

        // 语音合成
        String text = "你好，欢迎使用语音合成服务";
        String voiceId = "7468512265151725595"; // 从音色列表中获取的音色ID

        // 使用默认参数合成
        byte[] audioBytes = cozeApiUtil.speech(text, voiceId);

        // 保存音频文件
        java.nio.file.Files.write(
                java.nio.file.Paths.get("output.mp3"),
                audioBytes
        );

        System.out.println("音频文件已保存，大小: " + audioBytes.length + " 字节");

        // 使用自定义参数合成
        byte[] customAudioBytes = cozeApiUtil.speech(
                text,
                voiceId,
                "happy",     // emotion
                4.5,         // emotionScale
                "mp3",       // responseFormat
                20,          // loudnessRate
                1.0,         // speed
                32000        // sampleRate
        );

        // 保存自定义参数的音频文件
//        java.nio.file.Files.write(
//                java.nio.file.Paths.get("output_custom.mp3"),
//                customAudioBytes
//        );

//        System.out.println("自定义参数音频文件已保存，大小: " + customAudioBytes.length + " 字节");
    }


}
